package com.dtx.interpreter;

import java.util.StringTokenizer;

/**
 * 至此,关于Node类以及它的子类的学习就全部结束了。剩下的就是Context类了。Context类提供了语法解析所必须的方法，
 *
 *      Context类提供的方法
 *      名字              说明
 *      NextToken        获取下一个标记(前进至下一个标记)
 *      currentToken     获取当前的标记(不会前进至下一个标记)
 *      skipToken        先检查当前标记,然后获取下一个标记(前进至下一个标记)
 *      currentNumber    获取当前标记对应的数值(不会前进至下一个标记)
 *
 * 这里,我们使用java.util.StringTokenizer类来简化了我们的程序,它会将接收到的字符串分割为标记。在分割字符串时使用的分隔符是空格"''",
 * 制表符"'\t'",换行符"'\n'",回车符"'\r'",换页符"'\f'"(也可以使用其他分隔符,请根据需要查阅Java的API文档)。
 *
 *      Context类使用的java.util.StringTokenizer的方法
 *      名字              说明
 *      nextToken        获取下一个标记(前进至下一个标记)
 *      hasMoreTokens    检查是否还有下一个标记
 */
public class Context {

    private StringTokenizer tokenizer;

    private String currentToken;

    public Context(String text) {
        tokenizer = new StringTokenizer(text);
        nextToken();
    }

    public String nextToken(){
        if (tokenizer.hasMoreTokens()) {
            currentToken = tokenizer.nextToken();
        }else {
            currentToken = null;
        }
        return currentToken;
    }

    public String currentToken(){
        return currentToken;
    }

    public void skipToken(String token) throws ParseException{
        if (!token.equals(currentToken)) {
            throw new ParseException("Warning: " + token + " is expected,but "
                    + currentToken +" is found.");
        }
        nextToken();
    }

    public int currentNumber() throws ParseException{
        int number = 0;

        try {
            number = Integer.parseInt(currentToken);
        } catch (NumberFormatException e) {
            throw new ParseException("Warning: " + e);
        }
        return number;
    }
}
